12.5.10.2 Go 1.21で追加されたヘルパー関数
Go 1.21から関数を1回だけ実行するための3つのヘルパー関数が追加された
sync.OnceFunc
https://pkg.go.dev/sync#OnceFunc
sync.OnceValue
ジェネリックで任意の型の1つの戻り値を指定できる
https://pkg.go.dev/sync#OnceValue
sync.OnceValues
ジェネリックで任意の型の2つを戻り値を指定できる
https://pkg.go.dev/sync#OnceValues
上記のヘルパー関数は引数の関数を1回だけ呼び出す関数として返され、その関数の戻り値はキャッシュされる
code:go
package main
import (
"fmt"
"sync"
)
func main() {
// Parseは2度呼ばれているが「初期化中!」は一度しか出力されない
result := Parse("hello")
fmt.Println(result)
result2 := Parse("goodbye")
fmt.Println(result2)
}
type SlowComplicatedParser interface {
Parse(string) string
}
// 「func() SlowComplicatedParser」型のパッケージレベルの変数initParserCachedの宣言と初期値の代入
var initParserCached func() SlowComplicatedParser = sync.OnceValue(initParser) // initParserを1回呼び出す関数が返る(キャッシュされる)
func Parse(dataToParse string) string {
parser := initParserCached()
return parser.Parse(dataToParse)
}
func initParser() SlowComplicatedParser {
// 初期化処理を行う
fmt.Println("初期化中!")
return SCPI{}
}
type SCPI struct { // Slow Complicated Parser Instance
}
// SCPI のメソッド
func (s SCPI) Parse(in string) string {
if len(in) > 1 { // 先頭1文字を返す
return in0:1
}
return ""
}